package net.jgrm.idgenerator.service.impl;

import lombok.extern.slf4j.Slf4j;
import net.jgrm.idgenerator.service.IdGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * ID生成器服务，提供更友好的API接口
 */
@Slf4j
@Service
public class IdGeneratorService {

    @Autowired
    private IdGenerator idGenerator;

    /**
     * 生成默认业务类型的唯一ID
     *
     * @return 唯一ID
     */
    public Long generateId() {
        return idGenerator.nextId();
    }

    /**
     * 生成指定业务类型的唯一ID
     *
     * @param businessType 业务类型
     * @return 唯一ID
     */
    public Long generateId(String businessType) {
        return idGenerator.nextId(businessType);
    }

    /**
     * 批量生成唯一ID
     *
     * @param count 生成数量
     * @return ID数组
     */
    public Long[] batchGenerateId(int count) {
        // 获取批量生成的ID数组
        Long[] ids = idGenerator.batchNextId(count);

        // 验证并确保返回的是正确初始化的数组
        if (ids == null || ids.length != count) {
            throw new RuntimeException("批量生成ID失败，返回的ID数量与请求数量不匹配");
        }

        return ids;
    }

    /**
     * 批量生成指定业务类型的唯一ID
     *
     * @param businessType 业务类型
     * @param count        生成数量
     * @return ID数组
     */
    public Long[] batchGenerateId(String businessType, int count) {
        // 如果是SnowflakeIdGenerator实例并且业务类型为default或null，直接调用批量方法避免重复
        if (idGenerator instanceof SnowflakeIdGenerator) {
            return idGenerator.batchNextId(count);
        }

        // 其他实现或指定了非默认业务类型时使用循环方式
        Long[] ids = new Long[count];
        synchronized (idGenerator) {
            for (int i = 0; i < count; i++) {
                ids[i] = idGenerator.nextId(businessType);
            }
        }
        return ids;
    }
}